﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AccesoDatos;
using TestApplication.ReferenciaSimulador;
using System.Data.Linq;
using System.Collections;
using Npgsql;
using System.Configuration;

namespace TestApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            AccesoDatos.EntidadesDataContext edc = new AccesoDatos.EntidadesDataContext();

            double latitudParada = 2.70803980655411;
            double longitudParada = 82.0825712005992;

            int[] sublineas = { 24 };

            double latitudBondi = 21.2593362765663;
            double longitudBondi = 24.5255813712839;
            bool sentidoAscendente = true;

            var bondis = (from b in edc.POSICION_OMNIBUS
                          where sublineas.Contains(b.SUBLINEA_ID)
                          && b.PO_DIA == (int)DateTime.Now.DayOfWeek
                          && new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, b.PO_HORA.Hours, b.PO_HORA.Minutes, b.PO_HORA.Seconds).CompareTo(DateTime.Now.AddMinutes(-5)) > 0
                          && new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, b.PO_HORA.Hours, b.PO_HORA.Minutes, b.PO_HORA.Seconds).CompareTo(DateTime.Now.AddMinutes(5)) < 0
                          && b.PO_ASCENDENTE == sentidoAscendente
                          && b.PO_LATITUD >= (latitudBondi - 0.0005)
                          && b.PO_LATITUD <= (latitudBondi + 0.0005)
                          && b.PO_LONGITUD >= (longitudBondi - 0.0005)
                          && b.PO_LONGITUD <= (longitudBondi + 0.0005)
                          select b).ToArray();

            // Calculo el promedio
            double milisegundosDemora = 0;
            double cantidadDemoras = 0;
            foreach (var bondi in bondis)
            {
                // PAra cada uno busco a que hora estaban cerca de la parada
                var bondisEnLaParada = (from b in edc.POSICION_OMNIBUS
                                        where b.OMNIBUS_ID == bondi.OMNIBUS_ID
                                        && b.PO_FECHA.CompareTo(bondi.PO_FECHA) == 0
                                        && b.PO_ASCENDENTE == sentidoAscendente
                                        && b.PO_LATITUD >= (latitudParada - 0.0005)
                                        && b.PO_LATITUD <= (latitudParada + 0.0005)
                                        && b.PO_LONGITUD >= (longitudParada - 0.0005)
                                        && b.PO_LONGITUD <= (longitudParada + 0.0005)
                                        && b.PO_HORA.CompareTo(bondi.PO_HORA) > 0
                                        orderby (b.PO_HORA.Subtract(bondi.PO_HORA)) descending
                                        select b).ToArray();
                var bondiParada = bondisEnLaParada[0];
                milisegundosDemora += bondiParada.PO_HORA.Subtract(bondi.PO_HORA).TotalMilliseconds;
                cantidadDemoras = cantidadDemoras + 1;
            }

            double miliSegundosPromedio = milisegundosDemora / cantidadDemoras;

        }

        private DataSet ejecutarQuery(String query, String nmTabla, NpgsqlConnection conexion)
        {
            DataSet myDataSet = new DataSet();
            NpgsqlCommand rsCommandDistancia = conexion.CreateCommand();
            rsCommandDistancia.CommandText = query;
            NpgsqlDataAdapter rsDATAadapterDistancia = new NpgsqlDataAdapter();
            rsDATAadapterDistancia.SelectCommand = rsCommandDistancia;
            rsDATAadapterDistancia.Fill(myDataSet, nmTabla);
            return myDataSet;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            AccesoDatos.EntidadesDataContext edc = new AccesoDatos.EntidadesDataContext();

            var delLineas = (from l in edc.LINEAs
                             select l).ToArray();
            edc.LINEAs.DeleteAllOnSubmit(delLineas);
            edc.SubmitChanges();

            NpgsqlConnection conexion = new NpgsqlConnection(ConfigurationManager.AppSettings["postgisConn"]);
            String queryGetLineas = "select gid, nombre from lineas";
            DataSet dataSetLineas = ejecutarQuery(queryGetLineas, "lineas", conexion);
            DataTable dtLineas = dataSetLineas.Tables["lineas"];
            foreach (DataRow rowLinea in dtLineas.Rows)
            {
                int idLinea = (int)rowLinea[0];
                string nombre = (string)rowLinea[1];
                LINEA linea = new LINEA();
                linea.LINEA_ID = idLinea;
                linea.LINEA_NOMBRE = nombre;
                edc.LINEAs.InsertOnSubmit(linea);
                edc.SubmitChanges();
            }
            MessageBox.Show("READY");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            int idLinea = int.Parse(textBox1.Text);

            using (AccesoDatos.EntidadesDataContext edc = new AccesoDatos.EntidadesDataContext())
            {
                var linea = (from l in edc.LINEAs
                             select l).First();


                //foreach (var linea in lineas)
                //{
                ServiceSoapClient ssc = new ServiceSoapClient();
                DataTable infoLinea = ssc.devolverInformacionLinea(linea.LINEA_ID);

                dataGridView1.DataSource = infoLinea;
                // Recorro las rows y genero nuevas entidades
                foreach (DataRow infoRow in infoLinea.Rows)
                {
                    POSICION_OMNIBUS po = new POSICION_OMNIBUS();
                    po.EMPRESA_ID = (int)infoRow["empresa"];
                    po.LINEA_ID = (int)infoRow["codLinea"];
                    po.OMNIBUS_ID = (int)infoRow["idOmnibus"];
                    po.PO_ASCENDENTE = infoRow["sentido"].Equals("A");
                    po.PO_DIA = (int)DateTime.Now.DayOfWeek;
                    po.PO_FECHA = DateTime.Now;
                    po.PO_HORA = po.PO_FECHA.TimeOfDay;
                    po.PO_LATITUD = (double)infoRow["x"];
                    po.PO_LONGITUD = (double)infoRow["y"];
                    po.SUBLINEA_ID = (int)infoRow["codSubLinea"];
                    po.VARIANTE = infoRow["variante"] as string;
                    edc.POSICION_OMNIBUS.InsertOnSubmit(po);

                    edc.SubmitChanges();
                }

                //}
            }
            MessageBox.Show("LISTO EL POLLO");

        }
    }
}
